Qt QSplitter任意拆分窗口


 

Qt拆分窗口可以使用QSplitter,也可以使用比較容易使用布局控件來完成,本文章給出使用QSplitter分割窗口的例子。

QSplitter 繼承自QFrame,而QFrame又繼承自QWidget,這點很重要。

對於使用QSplitter拆分窗口:

  1)新建一個QSplitter,就意味着新建了一個QWidget

  2)不同的QSplitter對象通過指定父子關系來完成嵌套(划分窗口)

  3)QSplitter可以放置到你指定的任何窗口內

 

例子1:將一個窗口拆分為左右兩列,如下圖所示:

代碼如下:

int main(int argc, char *argv[])
{
//例子1,
qDebug("Mainframe start...\n");
QApplication app(argc, argv);

QTextCodec::setCodecForTr(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));
QTextCodec::setCodecForLocale(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));

QSplitter *pSpliter = new QSplitter(Qt::Horizontal);
//QTextEdit* pLeftEdt = new QTextEdit(pSpliter); //此注釋指定父窗口,打開后,后面的pSpliter->addWidget(pLeftEdt); 可以注釋掉

QTextEdit* pLeftEdt = new QTextEdit;
pLeftEdt->setText(QObject::tr("左窗口"));
//QTextEdit* pRightEdt = new QTextEdit(pSpliter); //此注釋指定父窗口,打開后,后面的pSpliter->addWidget(pRightEdt); 可以注釋掉
QTextEdit* pRightEdt = new QTextEdit;
pRightEdt->setText(QObject::tr("右窗口"));
pSpliter->addWidget(pLeftEdt);
pSpliter->addWidget(pRightEdt);

pSpliter->setStretchFactor(0, 1);//下面兩句設置左右兩列的寬度比為1:4

pSpliter->setStretchFactor(1, 4);
pSpliter->setWindowTitle(QObject::tr("Split-Wnd Demo1"));
pSpliter->show();
return app.exec();

}

 

例子2:將一個窗口拆分為左右兩列,右面再拆分為上下兩列,如下圖所示:

代碼如下:

qDebug("Mainframe start...\n");
QApplication app(argc, argv);

QTextCodec::setCodecForTr(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));
QTextCodec::setCodecForLocale(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));

QSplitter *pSpliter = new QSplitter(Qt::Horizontal);
QTextEdit* pLeftEdt = new QTextEdit(pSpliter);
pLeftEdt->setText(QObject::tr("左窗口"));

QSplitter *pRightSpliter = new QSplitter(Qt::Vertical, pSpliter);
QTextEdit* pRightTopEdt = new QTextEdit(pRightSpliter);
pRightTopEdt->setText(QObject::tr("右上窗口"));
QTextEdit* pRightBtmEdt = new QTextEdit(pRightSpliter);
pRightBtmEdt->setText(QObject::tr("右下窗口"));
pSpliter->setStretchFactor(0, 1);
pSpliter->setStretchFactor(1, 4);

pRightSpliter->setStretchFactor(0, 1);//右面窗口上下窗口高度比為1:4
pRightSpliter->setStretchFactor(1, 4);
pSpliter->setWindowTitle(QObject::tr("Split-Wnd Demo2"));

pSpliter->show();
return app.exec();

 

例子3:將一個窗口拆分為左右兩列,左面再拆分為上下兩列,與例子2恰好相反,如下圖所示:

代碼如下:

qDebug("Mainframe start...\n");
QApplication app(argc, argv);

QTextCodec::setCodecForTr(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));
QTextCodec::setCodecForLocale(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(QTextCodec::codecForLocale()->name()));

QSplitter *pLeftSpliter = new QSplitter(Qt::Vertical);
QTextEdit* pLeftTopEdt = new QTextEdit(pLeftSpliter);
pLeftTopEdt->setText(QObject::tr("左上窗口"));
QTextEdit* pLeftBtmEdt = new QTextEdit(pLeftSpliter);
pLeftBtmEdt->setText(QObject::tr("左下窗口"));

QSplitter *pSpliter = new QSplitter(Qt::Horizontal);
QTextEdit* pRightEdt = new QTextEdit;
pRightEdt->setText(QObject::tr("右窗口"));

pSpliter->addWidget(pLeftSpliter);
pSpliter->addWidget(pRightEdt);

pSpliter->setStretchFactor(0, 4);
pSpliter->setStretchFactor(1, 1);//左右寬度比為4:1

pLeftSpliter->setStretchFactor(0, 4);//左面窗口上下窗口高度比為4:1
pLeftSpliter->setStretchFactor(1, 1);
pSpliter->setWindowTitle(QObject::tr("Split-Wnd Demo3"));

pSpliter->show();
return app.exec();

 

總結:QSplitter一次只能將一個窗口1分為2,橫向豎向拆分由參數指定。要理清部件間的父子關系。有了這個思路,可以任意拆分窗口數量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM