QT中新建的类继承QWidget和QMainWindow的不同之处

来源:互联网 发布:讲文明知礼仪的故事 编辑:程序博客网 时间:2024/06/06 02:49

最近在学习QT,在做界面的时候发现,新建一个类时,本以为QMainWindow是QWidget的派生类,直接继承QMainWindow就好了,但是发现 继承QWidget和继承QMainWindow会对后面的窗口布局和显示有一定的影响。自己总结下。

例:(1)在calc.h中这样声明类Calc,使其继承QWidget
class Calc: public QWidget//注意这里是继承QWidget,not QMainWindow
{
 Q_OBJECT  //宏,使用signal和slot要先这样

private:
 //QWidget *mainWidget;
 QLineEdit *lineEdit;
 QPushButton *oneButton;
 QPushButton *twoButton;
 QPushButton *threeButton;
 QPushButton *fourButton; Calc();

private slots:
 //slots of button
 void on_oneButton();
 void on_twoButton();
 void on_threeButton();
 void on_fourButton();

}

则在calc.cpp中的实现是这样的:

Calc::Calc()
{
 setWindowTitle("Simple Caculator");//相当于“this->setWindowTitle("Simple Caculator");”,this指的是当前new的对象
 setWindowIcon(QIcon(":/Resources/icon.jpg"));

 lineEdit = new QLineEdit("0.");

QHBoxLayout *lineLayout = new QHBoxLayout;
 lineLayout->addWidget(lineEdit);

QHBoxLayout *firstLayout = new QHBoxLayout;
 firstLayout->addWidget(threeButton);
 firstLayout->addWidget(fourButton);

QHBoxLayout *secondLayout = new QHBoxLayout;
 secondLayout->addWidget(oneButton);
 secondLayout->addWidget(twoButton);

QVBoxLayout *mainLayout = new QVBoxLayout;
 mainLayout->addLayout(lineLayout);
 mainLayout->addLayout(firstLayout);
 mainLayout->addLayout(secondLayout);

setLayout(mainLayout);

}

(2)而如果在calc.h中使类Calc继承QMainWindow

class Calc: public QMainWindow//注意这里是继承QMainWindow ,not  QWidget
{
 Q_OBJECT  //宏,使用signal和slot要先这样

private:
 QWidget *mainWidget;//增加的
 QLineEdit *lineEdit;
 QPushButton *oneButton;
 QPushButton *twoButton;
 QPushButton *threeButton;
 QPushButton *fourButton; Calc();
private slots:
 //slots of button
 void on_oneButton();
 void on_twoButton();
 void on_threeButton();
 void on_fourButton();

}

则在calc.cpp中的实现是与上面的不同的:

Calc::Calc()
{

mainWidget = new QWidget;//增加的
 setWindowTitle("Simple Caculator");//相当于“this->setWindowTitle("Simple Caculator");”,this指的是当前new的对象
 setWindowIcon(QIcon(":/Resources/icon.jpg"));

 lineEdit = new QLineEdit("0.");

QHBoxLayout *lineLayout = new QHBoxLayout;
 lineLayout->addWidget(lineEdit);

QHBoxLayout *firstLayout = new QHBoxLayout;
 firstLayout->addWidget(threeButton);
 firstLayout->addWidget(fourButton);

QHBoxLayout *secondLayout = new QHBoxLayout;
 secondLayout->addWidget(oneButton);
 secondLayout->addWidget(twoButton);

QVBoxLayout *mainLayout = new QVBoxLayout;
 mainLayout->addLayout(lineLayout);
 mainLayout->addLayout(firstLayout);
 mainLayout->addLayout(secondLayout);

mainWidget->setLayout(mainLayout); //增加的
 //setLayout(mainLayout); //去掉
 setCentralWidget(mainWidget);增加的

}

 

原创粉丝点击