最近在学习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);增加的
}