九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
堆棧窗體QStackedWidget類
這些窗體都比較類似,相對簡單,就沒什么可以深入研究的了。
下面用代碼實現(xiàn)上面窗口的設(shè)計:
1.建立項目時基類選擇QDialog,取消Gernerate form復(fù)選框的選中狀態(tài)。
2.在頭文件dialog.h中編寫如下代碼:
#include <QtGui/QDialog>#include <QListWidget>#include <QStackedWidget>#include <QLabel>class Dialog : public QDialog{ Q_OBJECTpublic: Dialog(QWidget *parent = 0); ~Dialog();private: QListWidget *leftlist; QStackedWidget *stack; QLabel *label1; QLabel *label2; QLabel *label3;};
3.在源文件dialog.cpp中編寫如下代碼:
#include "dialog.h"#include <QHBoxLayout>Dialog::Dialog(QWidget *parent) : QDialog(parent){ setWindowTitle(tr("StackedWidget")); //設(shè)置列表框 leftlist=new QListWidget(this); leftlist->insertItem(0,tr("window1")); leftlist->insertItem(1,tr("window2")); leftlist->insertItem(2,tr("window3")); //設(shè)置堆棧窗體 label1=new QLabel(tr("WindowTest1\n\tby liming")); label2=new QLabel(tr("WindowTest2\n\tby liming")); label3=new QLabel(tr("WindowTest3\n\tby liming")); stack=new QStackedWidget(this); stack->addWidget(label1); stack->addWidget(label2); stack->addWidget(label3); //設(shè)置主窗體布局 QHBoxLayout *mainLayout=new QHBoxLayout(this); mainLayout->setMargin(5); mainLayout->setSpacing(5); mainLayout->addWidget(leftlist); mainLayout->addWidget(stack,0,Qt::AlignHCenter); mainLayout->setStretchFactor(leftlist,1); mainLayout->setStretchFactor(stack,3); connect(leftlist,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));}
解析:
1.這里的程序是,選中左邊列表框內(nèi)的內(nèi)容,顯示相應(yīng)的窗體。
2.所以,第一步是初始化列表框QListWidget。
3.第二步新建堆棧窗體:
stack=new QStackedWidget(this);然后將三個相應(yīng)的label放入其中:
stack->addWidget(label1);stack->addWidget(label2);stack->addWidget(label3);
4.設(shè)置主窗體布局時,用到了布局管理器。這里用到的是水平排列窗體QHBoxLayout:
QHBoxLayout *mainLayout=new QHBoxLayout(this);
這個布局管理器用法為:
×對話框邊距設(shè)為5
mainLayout->setMargin(5);
×內(nèi)部控件間距為5
mainLayout->setSpacing(5);
×對于setStetchFactor函數(shù),借用別的文章說明(http://blog.csdn.net/lin49940/article/details/6033727):
這里講得是QSplitter的setStetchFactor函數(shù):
程序為
對于B 和 A 來說, 他們的本身的大小相對于整個窗口來說, 都是很小的. 這樣就存在著一些多余的空間, 這些空間可以給B, 也可以給A, 或者兩個平分. 對于B 和 A 各自空間大小的控制, 是通過 QSplitter 的 setStretchFactor 方法, 該方法的聲明:
void setStretchFactor(int index, int stretch);
第一個參數(shù)index 是子微件的索引值, 從0 開始. 這里的話, B 是0, A 是1; 第二個參數(shù) stretch 是拉伸系數(shù), int 類型, 下面主要對stretch 的數(shù)值進(jìn)行說明.
1.  mainSplitter->setStretchFactor(0, -2);
效果如下,
B占據(jù)了所有多余的空間, 看來 stretch 的值如果為負(fù)整數(shù), 那這個微件將占據(jù)最大的空間.
2.     mainSplitter->setStretchFactor(0, -2);
mainSplitter->setStretchFactor(1, -4);
效果如下:
B 和 A 平分了空間, 看來stretch 如果是負(fù)整數(shù)就會盡可能的占據(jù)空間, 而不看負(fù)整數(shù)的大小, 把 -2 改為 -12, 結(jié)果一樣的.
3.     mainSplitter->setStretchFactor(0, 0);
mainSplitter->setStretchFactor(1, 0);
效果同第二.
4.       mainSplitter->setStretchFactor(0, 0);  //可以把這段注釋掉, 效果一樣
mainSplitter->setStretchFactor(1, 1);
效果如下:
5.     mainSplitter->setStretchFactor(0, 4);
mainSplitter->setStretchFactor(1, 8);
效果如下:
6.     mainSplitter->setStretchFactor(0, -4);
mainSplitter->setStretchFactor(1, 8);
效果如下,
從 1, 2 和 6 的測試效果可以看出, 拉伸系數(shù)為負(fù)整數(shù)的微件將占據(jù)最大的多余空間.
從3, 4 和 5 的測試效果來看, 就算我們不設(shè)置 B 或 A 的拉伸系數(shù)stretch, 他們內(nèi)部也應(yīng)該存在著一個默認(rèn)拉伸系數(shù)值0. stretch為 0 的微件, 將把最大多余空間讓給stretch 為正整數(shù)的微件. 如果有多個stretch 為正整數(shù)的微件, 他們的多余空間的占有率由通過數(shù)字的比例來確定的.
注:因此,我的堆棧窗體程序中的
mainLayout->setStretchFactor(leftlist,1); mainLayout->setStretchFactor(stack,3);就是設(shè)定了list與stack比例為1:3。
5.設(shè)定消息相應(yīng)的信號與槽:
connect(leftlist,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));都是控件自帶的信號與槽,這里將其關(guān)聯(lián)起來,就達(dá)到了程序的設(shè)計效果:
更改第幾行就顯示第幾個Label。
最后編譯運行:
QT之切分窗口
QSplitter就是一個可以包含一些其他窗口部件的部件。在切分窗口QSplitter中的這些窗口部件會通過切分條Splitter handle而分割開來。用戶可以通過拖動這些分割條改變切分條中子窗口的大小。QSplitter中的子窗口部件將會自動按照創(chuàng)建時的順序一個挨著一個的放在一起,并且以切分窗口分割條來分割相鄰的窗口。下面是代碼實例
#include <QtGui>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextEdit *editor1 = new QTextEdit;    //定于在splitter中的三個編輯框
QTextEdit *editor2 = new QTextEdit;
QTextEdit *editor3 = new QTextEdit;
QSplitter splitter(Qt::Horizontal);        //定義一個切分窗口
splitter.addWidget(editor1);               //將文件控件加入到切分框
splitter.addWidget(editor2);
splitter.addWidget(editor3);
editor1->setPlainText("Mon enfant, ma soeur,\n"
"Songe  la douceur\n"
"D'aller l-bas vivre ensemble,\n"
"Aimer  loisir,\n"
"Aimer et mourir\n"
"Au pays qui te ressemble.");
editor2->setPlainText("My child, my sister,\n"
"think of the sweetness\n"
"of going there to live together!\n"
"To love at leisure,\n"
"to love and to die\n"
"in a country that is the image of you!");
editor3->setPlainText("Mein Kind, meine Schwester,\n"
"denke an den Traum\n"
"dort hin(unter) zu gehen um zusammen\n"
"zu leben und in aller Ruhe zu lieben,\n"
"Zu lieben und zu sterben\n"
"in dem Land, das dir gleicht.");
splitter.setWindowTitle(QObject::tr("Splitter"));          //設(shè)置標(biāo)題
splitter.show();
return app.exec();
}
效果如下:
可以隨意改變各個窗口大?。?div style="height:15px;">
另外下面演示下使用多個splitter進(jìn)行水平或者垂直方向上的嵌套。本代碼適用于《C++ GUI QT4》
mailclient.cpp. 其界面布局部分代碼如下
//窗口布局
rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(messagesTreeWidget);  //在右窗口中添加一個郵件列表
rightSplitter->addWidget(textEdit);                         //顯示文本郵件
rightSplitter->setStretchFactor(1, 1);                      //保證textEdit伸展到多余的空間
mainSplitter = new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(foldersTreeWidget);
mainSplitter->addWidget(rightSplitter);
mainSplitter->setStretchFactor(1, 1);                     //使用兩個setStretchFactor保證了把多余的額外空間都留給textEdit
setCentralWidget(mainSplitter);
setWindowTitle(tr("Mail Client"));
效果如下圖:
(清悠我心:http://hi.baidu.com/%E6%B8%85%E6%82%A0%E6%88%91%E5%BF%83/home
分割窗口在應(yīng)用程序中經(jīng)常用到,比如在類似資源管理器的窗口設(shè)計中:
下面用代碼實現(xiàn)上面窗口的設(shè)計:
1.建立項目時基類選擇QMainWindow,取消Gernerate form復(fù)選框的選中狀態(tài)。
2.在main.cpp中編寫如下代碼:
view plaincopy to clipboard
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QSplitter>
#include <QTextCodec>
#include <QTextEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//設(shè)置字體
QFont font("ZYSong18030",12);
a.setFont(font);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
//主splitter,以下填充text和子splitter
QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);
QTextEdit *textLeft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);
textLeft->setAlignment(Qt::AlignCenter);
QSplitter *splitterRight=new QSplitter(Qt::Vertical,splitterMain);
splitterRight->setOpaqueResize(false);
//開始填充右邊的splitter,放上兩個text
QTextEdit *textTop=new QTextEdit(QObject::tr("Right Top Widget"),splitterRight);
textTop->setAlignment(Qt::AlignCenter);
QTextEdit *textBottom=new QTextEdit(QObject::tr("Right Bottom Widget"),splitterRight);
textBottom->setAlignment(Qt::AlignCenter);
//設(shè)置主splitter
splitterMain->setStretchFactor(1,1);
splitterMain->setWindowTitle(QObject::tr("Splitter"));
splitterMain->show();
return a.exec();
}
[cpp] view plaincopy
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QSplitter>
#include <QTextCodec>
#include <QTextEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//設(shè)置字體
QFont font("ZYSong18030",12);
a.setFont(font);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
//主splitter,以下填充text和子splitter
QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);
QTextEdit *textLeft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);
textLeft->setAlignment(Qt::AlignCenter);
QSplitter *splitterRight=new QSplitter(Qt::Vertical,splitterMain);
splitterRight->setOpaqueResize(false);
//開始填充右邊的splitter,放上兩個text
QTextEdit *textTop=new QTextEdit(QObject::tr("Right Top Widget"),splitterRight);
textTop->setAlignment(Qt::AlignCenter);
QTextEdit *textBottom=new QTextEdit(QObject::tr("Right Bottom Widget"),splitterRight);
textBottom->setAlignment(Qt::AlignCenter);
//設(shè)置主splitter
splitterMain->setStretchFactor(1,1);
splitterMain->setWindowTitle(QObject::tr("Splitter"));
splitterMain->show();
return a.exec();
}
解析:
1.QSplitter的構(gòu)造方法:
QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);第一個參數(shù)通過Qt::Horizontal 和 Qt::Vertical來設(shè)定為水平分割或垂直分割。第二個設(shè)定0代表是主窗口,無父窗口。
不過子splitter設(shè)置的
new QSplitter(Qt::Vertical,splitterMain);代表主窗口是splitterMain。則子splitter就被添加到splitterMain中。
添加時為從左至右(或從上至下)添加;
2.添加QTextEdit控件。
QTextEdit *textLeft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);第一個參數(shù)設(shè)置文本內(nèi)容,第二個參數(shù)設(shè)置主窗體。
3.設(shè)置拖動時是否實時更新
splitterRight->setOpaqueResize(false);false為不實時更新——在拖動時候只顯示一條灰色的線條,在拖動到位并釋放鼠標(biāo)后再顯示分割條。默認(rèn)為true——實時更新。
4.設(shè)定可伸縮控件:
splitterMain->setStretchFactor(1,1);第一個參數(shù)代表控件序號,第一個序號為0.后面參數(shù)0代表不可伸縮,非0代表可伸縮。
這里設(shè)置右邊的可伸縮。當(dāng)拉伸整個窗口時候,左邊保持原來寬度。
拉伸后,我們發(fā)現(xiàn)左邊的寬度不變。
當(dāng)使用QSplitter時,如果是多個QSPlitter嵌套使用(如下圖)
就很容易出現(xiàn)錯誤。通常是“內(nèi)存不能為read” (如下圖)
代碼如下:(錯誤的用法)
[cpp]view plaincopyprint?
#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QSplitter>
#include <QTextEdit>
#include <QTableWidget>
#include <QTreeWidget>
#include <QSettings>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QTextEdit *editor1 = new QTextEdit;
QTableWidget *table = new QTableWidget;
QTreeWidget *tree = new QTreeWidget;
//子splitter
QSplitter vSplitter(Qt::Vertical);
vSplitter.addWidget(table);
vSplitter.addWidget(editor1);
//父splitter
QSplitter hSplitter(Qt::Horizontal);
hSplitter.addWidget(tree);
hSplitter.addWidget(&vSplitter);
hSplitter.show();
return app.exec();
}
#include <QApplication>#include <QFont>#include <QPushButton>#include <QSplitter>#include <QTextEdit>#include <QTableWidget>#include <QTreeWidget>#include <QSettings>int main(int argc, char* argv[]){ QApplication app(argc, argv); QTextEdit *editor1 = new QTextEdit; QTableWidget *table = new QTableWidget; QTreeWidget *tree = new QTreeWidget; //子splitter QSplitter vSplitter(Qt::Vertical); vSplitter.addWidget(table); vSplitter.addWidget(editor1); //父splitter QSplitter hSplitter(Qt::Horizontal); hSplitter.addWidget(tree); hSplitter.addWidget(&vSplitter); hSplitter.show(); return app.exec();}
出現(xiàn)錯誤的原因為,如果先創(chuàng)建的是父QSplitter,然后創(chuàng)建的子QSplitter,則沒有錯誤。
因為當(dāng)關(guān)閉窗體是,調(diào)用析構(gòu)函數(shù)的順是:子,父。
但是如果是先創(chuàng)建的子QSplitter,然后創(chuàng)建的父QSplitter,那么在關(guān)閉窗體時,
先調(diào)用的是父QSplitter的析構(gòu)函數(shù),然后才調(diào)用的子QSplitter的析構(gòu)函數(shù)。
這樣就會出錯。個人猜測試由于在父QSplitter的析構(gòu)函數(shù)中已經(jīng)自動調(diào)用了子QSplitter的析構(gòu)函數(shù),
當(dāng)再次調(diào)用子QSplitter的析構(gòu)函數(shù)時,就會找不到對象,導(dǎo)致出錯。
這就要求我們一定要按順序定義QSplitter,這很難做到。
相反,如果我們自己決定調(diào)用析構(gòu)函數(shù)的順序就不會出錯了。
因此,正確的使用QSplitter的方法是在堆上建立對象,然后自行delete。
正確用法如下:
[cpp]view plaincopyprint?
include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QSplitter>
#include <QTextEdit>
#include <QTableWidget>
#include <QTreeWidget>
#include <QSettings>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QTextEdit *editor1 = new QTextEdit;
QTableWidget *table = new QTableWidget;
QTreeWidget *tree = new QTreeWidget;
//子splitter
QSplitter *vSplitter = new QSplitter(Qt::Vertical);
vSplitter->addWidget(table);
vSplitter->addWidget(editor1);
//父splitter
QSplitter *hSplitter = new QSplitter(Qt::Horizontal);
hSplitter->addWidget(tree);
hSplitter->addWidget(vSplitter);
hSplitter->show();
app.exec();
delete vSplitter;   //先刪除子
delete hSplitter;   //后刪除父
return 0;
}
include <QApplication>#include <QFont>#include <QPushButton>#include <QSplitter>#include <QTextEdit>#include <QTableWidget>#include <QTreeWidget>#include <QSettings>int main(int argc, char* argv[]){ QApplication app(argc, argv); QTextEdit *editor1 = new QTextEdit; QTableWidget *table = new QTableWidget; QTreeWidget *tree = new QTreeWidget; //子splitter QSplitter *vSplitter = new QSplitter(Qt::Vertical); vSplitter->addWidget(table); vSplitter->addWidget(editor1); //父splitter QSplitter *hSplitter = new QSplitter(Qt::Horizontal); hSplitter->addWidget(tree); hSplitter->addWidget(vSplitter); hSplitter->show(); app.exec(); delete vSplitter; //先刪除子 delete hSplitter; //后刪除父 return 0;}
ps:
由于調(diào)用父splitter會自動刪除其內(nèi)部的所有控件,所以也可以直接delete父QSplitter。
這樣連里面的其他控件也會刪除了。但是切記,一定要用new。
ps:
類似的布局類控件如QScrollArea也要注意相同的問題。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
QSplitter 學(xué)習(xí)
QSplitter(分離部件)
【第八節(jié)】PyQt5控件(II)
QListView,QTreeView和 QStandardItemModel的簡單使用
QT 隱式共享 Implicit Sharing
PyQt5之布局管理
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服