iT邦幫忙

0

Qt 增加視窗

大大好 我是剛學習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等...

謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
loukei
iT邦新手 5 級 ‧ 2019-08-29 19:15:52
最佳解答

如果你想學習QT5,可以參考這個網站
Qt 学习之路 2
不過這個有點年代,最正確的知識還是去看官方Doc原文


回到你的題目
Qt本身不單純是一個c++ ui庫,他還擴張了c++的語法。
當你使用QObject所衍生的類別(所有的Qt視窗組件QWidget類),Qt會先經過一個預先編譯的動作
在你的QObject類別增加一堆東東

假設你的專案叫Test,有一個mainWindow.h/ccpp文件
https://ithelp.ithome.com.tw/upload/images/20190829/20117784JouEMpSoPy.png
那麼按下Build後,你會再build資料夾下發現一個moc_mainwindow.cpp
https://ithelp.ithome.com.tw/upload/images/20190829/20117784NZoLwh2sLD.png
這才是真正gcc執行時使用的檔案
https://ithelp.ithome.com.tw/upload/images/20190829/20117784TPSmoMR5PL.png
看起來很複雜,其實原本的mainwindow都是專案建立時預設的
這叫做Qt meta object system

甚麼情況下類別聲明要用到Q_OBJECT宏?
當你寫到任何繼承qobject的類別,或是任何需要使用signal-slot機制的類別都需要
signal-slot是Qt視窗程式的核心之一,這裡不多做解釋


再來是ui聲明
Qt提供了一種快速創建UI介面的技術叫做Qt designer
簡單來說就是拉拉元件、把按鈕拖到視窗就能建造出基本的視窗程式
Qt Designer

你的mainwindow class 會多出一個叫mainwindow.ui的檔案對應
叫做mainwindow form
mainwindow.ui同樣會經過預編譯變成ui_mainwindow.h的檔案
你可以透過ui指標取得在mainwindow.ui拖拉的元件
比如ui->pushbutton就是指向一個按鈕

ui不是必須的,它只是Qt提供的一個工具,寫Qt視窗可以完全不用它
建議初學者先不使用它
等到你覺得寫ㄧ個視窗程式有十幾個子元件要記憶很痛苦的時候
再來考慮加入ui


P.S.
開啟新視窗的方式可以參考
Yes

其實對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及其派生类(一)

a000114 iT邦新手 5 級 ‧ 2019-08-30 15:18:00 檢舉

十分感謝您 您應該是Qt高手吧

a000114 iT邦新手 5 級 ‧ 2019-08-30 15:18:40 檢舉

後來我沒有使用ui了
一開始就希望能夠用代碼實現

loukei iT邦新手 5 級 ‧ 2019-08-30 18:17:08 檢舉

不算高手,我連線程都還沒摸到邊
略有些心得而已
另外你要開發非桌面類程式的話用的不是這套(QWidget模組)
要考慮Qt Quick模組,這部分我也沒摸過

0
舜~
iT邦高手 1 級 ‧ 2019-08-28 15:02:44

個人沒寫過QT,關於 Q_OBJECT 給您參考

https://blog.csdn.net/qq_37233607/article/details/78124648

a000114 iT邦新手 5 級 ‧ 2019-08-30 15:17:32 檢舉

謝謝

我要發表回答

立即登入回答