大大好 我是剛學習Qt的新手
我想請教關於,要怎麼在點擊一個按鈕後從 mainwindow 跳到一個新的類似 mainwindow 的視窗
另外我想問,關於標頭檔的部分,為何一開始要打一些ui Q_OBJECT什麼的
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
要如何自己寫一個子視窗的class
我希望可以不用Qt designer 所以想要了解這些,會基礎c++ (C++14以上 STL等...
謝謝
如果你想學習QT5,可以參考這個網站
Qt 学习之路 2
不過這個有點年代,最正確的知識還是去看官方Doc原文
回到你的題目
Qt本身不單純是一個c++ ui庫,他還擴張了c++的語法。
當你使用QObject所衍生的類別(所有的Qt視窗組件QWidget類),Qt會先經過一個預先編譯的動作
在你的QObject類別增加一堆東東
假設你的專案叫Test,有一個mainWindow.h/ccpp文件
那麼按下Build後,你會再build資料夾下發現一個moc_mainwindow.cpp
這才是真正gcc執行時使用的檔案
看起來很複雜,其實原本的mainwindow都是專案建立時預設的
這叫做Qt meta object system
甚麼情況下類別聲明要用到Q_OBJECT宏?
當你寫到任何繼承qobject的類別,或是任何需要使用signal-slot機制的類別都需要
signal-slot是Qt視窗程式的核心之一,這裡不多做解釋
再來是ui聲明
Qt提供了一種快速創建UI介面的技術叫做Qt designer
簡單來說就是拉拉元件、把按鈕拖到視窗就能建造出基本的視窗程式
你的mainwindow class 會多出一個叫mainwindow.ui的檔案對應
叫做mainwindow form
mainwindow.ui同樣會經過預編譯變成ui_mainwindow.h的檔案
你可以透過ui指標取得在mainwindow.ui拖拉的元件
比如ui->pushbutton就是指向一個按鈕
ui不是必須的,它只是Qt提供的一個工具,寫Qt視窗可以完全不用它
建議初學者先不使用它
等到你覺得寫ㄧ個視窗程式有十幾個子元件要記憶很痛苦的時候
再來考慮加入ui
其實對QtWidget組件而言
沒有parent的組件都可以當作視窗[參考6]
最簡單的做法是繼承ㄧ個QDialog
// MyDialog.h
class MyDialog : public QDialog {
//...
}
// in class mainwindow
class Mainwindow
{
//...mainwindow 其它內容
private slots:
void on_pushbutton_clicked();
}
Mainwindow::Mainwindow(){
//...
connect(ui->pushbutton,&QPushButton::clicked,
this,&Mainwindow::on_pushbutton_clicked);
}
void Mainwindow::on_pushbutton_clicked(){
auto dialog = new MyDialog(this);
dialog->exec();
}
這裡只是簡單提一下,有些敘述可能不太精確
建議你按照上面的關鍵字自行google補充
1.Qt 学习之路 2(10):对象模型
2.Qt 学习之路 2(3):Hello, world!
3.The Meta-Object System
4.Qt Designer Manual
5.Window and Dialog Widgets
6.漫谈QWidget及其派生类(一)