qt布局控制項 - CSDN

2021-01-16 CSDN技術社區

Qt基本控制項及三大布局

來源: http://blog.csdn.net/a2604539133/article/details/73920696

Qt基本模塊

一、Qt的三大布局

QHBoxLayout:

水平顯示布局,所有在其上面擺放的控制項只能水平排列下去;

QVBoxLayout:

垂直顯示布局,所有在其上面擺放的控制項只能垂直排列下去;

QGridLayout

格子顯示布局,可以按照表格的形式顯示布局;

二、Qt的控制項

label:標籤,可以顯示文本信息,只讀;

pushbutton : 普通按鈕;

radiobutton : 單選按鈕,多個單選按鈕中只能選擇一個,但是必須放入groupbox中,類似單選題;

checkbox : 多選複選按鈕,可以選擇同時選擇多個,類似多選題;

lineedit : 單行文本編輯框,可以輸入單行文本;

textedit : 多行文本輸入框,可以輸入顯示多行文本和圖片;

combobox : 下拉文本輸入框,在輸入框的最右邊有個三角下拉按鈕,可以選擇輸入,也可以手動輸入;

textbrower : 多行文本顯示框,只讀;

groupbox : 可以在裡面放入特點的東西,統一管理;

slider : 模擬顯示滑動條;

spinbox : 數值顯示滑動條;

dateedit :

timeedit :

datetimeedit :

lcdnumber :

三、Qt的信號槽

在Qt中所有的對象(繼承QObject類)都有connect函數,只要有這個函數就能建立信號槽(通過觸發某個控制項的信號函數,執行槽中相應的函數);(暫時這樣理解,還是有點理解不全面的,之後學習到再來修改);

在Qt中信號槽中可以使用自帶的函數,四個參數;也可以執行自定義的函數,三個參數;具體看下面test4的例子就明白了。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "MyWidgetEvent.h"

void test() ;

int main(int argc, char *argv[]) {

QApplication a(argc, argv);

test() ;

return a.exec();

}

void test(){

}

void test5ManyKongJian() {

QWidget *nanWidget = new QWidget() ;

QVBoxLayout *nanVLayout = new QVBoxLayout() ;

/*

**測試label控制項

*/

QLabel *label=nullptr ;

nanVLayout->addWidget( label = new QLabel("baidu") ) ;

//QPixmap me("./me.png") ;

//label->setPixmap( me ) ;//問題:連結和圖片重複了,怎麼分開

label->setWordWrap( true ) ;

label->adjustSize() ;

nanVLayout->connect( label , &QLabel::linkActivated , []( QString str){

qDebug()<

} ) ;

/*

**測試lineedit控制項

*/

QLineEdit *lineEdit ;

nanVLayout->addWidget( lineEdit = new QLineEdit("hello") ) ;

/*

**測試button控制項

*/

QPushButton *button ;

nanVLayout->addWidget( button = new QPushButton("???") ) ;

button->setStyleSheet("QPushButton {font:bold 16px; color:red;padding:5px}") ;

nanWidget->connect( button , &QPushButton::clicked , [](bool flag){

qDebug()<< "button" ;

}) ;

/*

**測試radiobutton控制項

*/

QRadioButton *radioButton ;

nanVLayout->addWidget( radioButton = new QRadioButton("qradiobutton") ) ;

radioButton->setStyleSheet("QRadioButton {font:bold 16px;color:blue;padding:5px}") ;

radioButton->connect( radioButton , &QRadioButton::clicked , [](bool flag){

qDebug()<< flag ;

}) ;

/*

**測試ckeckbox控制項

*/

QCheckBox *check ;

nanVLayout->addWidget( check = new QCheckBox("chekcbox") ) ;

/*

**測試combobox控制項

*/

QComboBox *combobox ;

nanVLayout->addWidget( combobox = new QComboBox() ) ;

combobox->addItem("select item1") ;

combobox->addItem("select item2") ;

combobox->addItem("... ...") ;

combobox->setEditable(true) ;

lineEdit->setText("start") ;

combobox->connect( combobox , SIGNAL(activated(const QString &)) , lineEdit , SLOT(setText(const QString &)) ) ;//這裡的下標要跟著顯示

combobox->setCompleter( new QCompleter(combobox->model()) ) ;

/*

**測試textedit

*/

QTextEdit *textEdit ;

nanVLayout->addWidget( textEdit = new QTextEdit("textedit") ) ;

textEdit->setText("

"

goodgoodgood"

"

nicenicenice"

"

"

"") ;

textEdit->connect( textEdit , &QTextEdit::textChanged,[&](){

//問題:textEdit->toPlainText() ;怎麼才能獲取到textEdit的實體,this->sender()

//QTextEdit _edit = (QTextEdit *)QObject::sender();

qDebug()<toPlainText() ;

}) ;

textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded) ;

textEdit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn) ;

/*

**測試groupbox控制項

*/

QGroupBox *groupBox ;

nanVLayout->addWidget( groupBox = new QGroupBox("groupbox") ) ;

QHBoxLayout *hLayout ;

groupBox->setLayout( hLayout = new QHBoxLayout() ) ;

hLayout->addWidget( new QRadioButton("boy") ) ;

hLayout->addWidget( new QRadioButton("girl") ) ;

/*

**測試模擬顯示條slider

*/

QSlider *slider ;

nanVLayout->addWidget( slider = new QSlider() ) ;

slider->setMinimum( -100 ) ;

slider->setMaximum( 100 ) ;

/*

**測試數字顯示條

*/

QSpinBox *spinBox ;

nanVLayout->addWidget( spinBox = new QSpinBox() ) ;

spinBox->setMinimum( -100 ) ;

spinBox->setMaximum( 100 ) ;

slider->connect( slider , SIGNAL(valueChanged(int)) , spinBox , SLOT(setValue(int)) ) ;

spinBox->connect( spinBox , SIGNAL(valueChanged(int)) , slider , SLOT(setValue(int)) ) ;

/*

**測試時間設置

*/

nanVLayout->addWidget( new QDateTimeEdit() ) ;

/*

**測試顯示時間,只讀

*/

QLCDNumber *number ;

nanVLayout->addWidget( number = new QLCDNumber() ) ;

number->display("1314") ;

number->setMode(QLCDNumber::Hex) ;

number->setSegmentStyle(QLCDNumber::Filled) ;

nanWidget->setLayout( nanVLayout ) ;

nanWidget->setWindowTitle("control") ;

nanWidget->show() ;

}

void test4GridAndHBox() {

QWidget *nanWidget = new QWidget() ;

QGridLayout *nanGridLayout = new QGridLayout() ;

QHBoxLayout *nanHBoxLayout = new QHBoxLayout() ;

nanGridLayout->addWidget( new QLabel("Username") , 1 , 1 ) ;

nanGridLayout->addWidget( new QLineEdit() , 1 , 2 ) ;

nanGridLayout->addWidget( new QLabel("Username") , 2 , 1 ) ;

nanGridLayout->addWidget( new QLineEdit() , 2 , 2 ) ;

nanGridLayout->addLayout( nanHBoxLayout , 3 , 2 ) ;

nanHBoxLayout->addStretch(1) ;

nanHBoxLayout->addWidget( new QPushButton("Login") , 1 ) ;

nanWidget->setLayout( nanGridLayout ) ;

nanWidget->show() ;

}

void test3GridLayout() {

QWidget *nanWidget = new QWidget() ;

QGridLayout *nanLayout = new QGridLayout() ;

QPushButton *nanButton = new QPushButton() ;

QLineEdit *nanLineEdit = new QLineEdit() ;

nanLayout->addWidget( nanLineEdit , 1 , 1 , 1 , 2 ) ;

nanLayout->addWidget( new QPushButton , 1, 3 ) ;

nanLayout->addWidget( new QLineEdit , 2, 1 , 2 , 1 ) ;

nanLayout->addWidget( new QPushButton , 2, 2 ) ;

nanLayout->addWidget( new QPushButton , 2, 3 ) ;

nanLayout->addWidget( nanButton , 3 , 3 ) ;

nanLayout->setColumnStretch( 1 , 1 ) ;

nanLayout->setColumnStretch( 2 , 1 ) ;/*設置每列的比重*/

nanLayout->setColumnStretch( 3 , 1 ) ;

nanWidget->setLayout( nanLayout ) ;

nanWidget->show() ;

}

void test2HBoxLayout() {

QWidget *nanQWidget = new QWidget() ;

QLineEdit *nanQLineEdit = new QLineEdit() ;

QHBoxLayout *nanHLayout = new QHBoxLayout() ;

nanHLayout->addWidget( nanQLineEdit , 1 ) ;

//添加,兩個控制項之間的距離addspaceing,兩個控制項在layout中的比重addstretch

nanQWidget->setLayout( nanHLayout ) ;

nanQWidget->show() ;

}

void test1(){

QWidget *w = new QWidget ;

QVBoxLayout *vLayout = new QVBoxLayout( ) ;

QPushButton *nanButton ;

QLineEdit *nanLineEdit ;

QLabel *nanLabel ;

QString content("null") ;

QCompleter nanQCompleter( QStringList()<

vLayout->addWidget( nanLineEdit = new QLineEdit() ) ;

vLayout->addWidget( nanButton = new QPushButton("right") ) ;

nanQCompleter.setFilterMode( Qt::MatchFlag::MatchContains ) ;

nanLineEdit->setCompleter( &nanQCompleter ) ;

nanLineEdit->setPlaceholderText( "Please input your name" ) ;

vLayout->addWidget( nanLabel = new QLabel() ) ;

nanLabel->setText( content ) ;

w->connect( nanButton , &QPushButton::clicked , [&](){

nanLabel->setText( nanLineEdit->text() ) ;

} ) ;

w->setLayout( vLayout) ;

w->show() ;

}

一、dialog、widget、mainwindow的區別

1)、dialog有exec函數,如果是dialog窗口,後邊的窗口時不可選的;

2)、widget和dialog都有show函數,如果通過這個函數顯示這兩種類型的窗口,則兩個窗口都是可選的;

3)、widget主要是在上面放置布局和控制項;

4)、mainwindow可以顯示菜單,工具欄,狀態欄、託盤等功能。

二、dialog窗口

這個dialog窗口只是為了給人們提供更好的可視化操作,但是對於程式設計師而言,這個操作並不是立刻執行的;而是當在窗口選擇關閉後,才將選擇的結果返回給後臺,後臺才可以根據選擇的結果進行相應的操作。

#include "mydialog.h"

mydialog::mydialog(QDialog *parent):QDialog(parent) {

QPushButton *button = new QPushButton( "button" , this ) ;

connect( button , SIGNAL(clicked()) , this , SLOT(slotButtonClick()) ) ;

}

void mydialog::slotButtonClick() {

#if 0

/*dialog和widget的區別,exec和show的區別而已*/

QDialog *dlg = new QDialog ;

QPushButton *button = new QPushButton("close" , dlg ) ;

connect( button , SIGNAL(clicked()) , dlg , SLOT(reject()) ) ;

int ret = dlg->exec( ) ;

//通過exec顯示出來的窗口稱為,模塊對話框

// 在模塊對話框中,exec有自己的消息循環,並且把app的消息循環接管了

// 如果Dialog是通過exec來顯示,那麼可以通過accept或者reject來關閉窗口

// 如果Dialog是通過show來顯示,那麼可以通過close來關閉窗口,這個和QWidget一樣的

// 有許多特殊的dailog:文件選擇,MessageBox,顏色選擇,字體選擇,列印預覽,列印

if( ret == QDialog::Accepted )

qDebug()<

else if( ret== QDialog::Rejected )

qDebug()<

#endif

#if 0

/*文件選擇:這個窗口可以選擇保存文件的名稱,然後將路徑+名稱返回,我們就可以根據返迴路徑名來保存文件。*/

QString strFilename = QFileDialog::getSaveFileName(NULL,

"Select file for save",

_strDir,

"pic file (*.png *.jpg)");

#endif

#if 0

/*文件選擇:選擇要打開的文件名(絕對路勁);我們就可以根據這個文件路徑來打開相應的文件*/

QString strFilename = QFileDialog::getOpenFileName(NULL,

"Select file for open",

_strDir,

"pic file (*.png *.jpg)");

#endif

#if 0

QString strFilename = QFileDialog::getExistingDirectory();

if(strFilename.isEmpty())

{

qDebug() << "select none";

return;

}

qDebug() << strFilename;

QFileInfo fileInfo(strFilename);

_strDir = fileInfo.filePath();

qDebug() << _strDir;

#endif

//do something for io ... ...

//上面的選擇將絕對路徑名都給拿下來了,如果要進行保存,不是很容易嗎!

QPixmap pixmap(this->size()) ;

QPainter painter(&pixmap) ;

this->render( &painter ) ;

pixmap.save(strFilename) ;

#if 0

/*顏色選擇對話框:可以選擇相應的顏色;然後將選擇的顏色返回,這樣我們就可以操作了*/

QColorDialog colorDia ;

colorDia.exec() ;

QColor c = colorDia.selectedColor() ;

#endif

#if 0

/*字體選擇對話框:可以選擇字體;然後將選擇的字體信息返回,我們同樣可以用這些信息來設置相應的值*/

QFontDialog fontDia ;

fontDia.exec() ;

QFont font = fontDia.selectedFont() ;

#endif

#if 0

/*這個也是彈窗對話框,不過只是簡單的選擇以下枚舉中的值,可以嘗試下效果*/

int ret = QMessageBox::question(this, "????", "realy do .......",

QMessageBox::Yes| QMessageBox::No|

QMessageBox::YesAll| QMessageBox::NoAll);

if(ret == QMessageBox::Yes)

{

qDebug() << "user select yes";

}

if(ret == QMessageBox::No)

{

qDebug() << "user select no";

}

#endif

}

void mydialog::paintEvent( QPaintEvent *ev ) {

}

mydialog::~mydialog(void) { }

三、widget窗口

前面已經介紹過很多繼承這個窗口的控制項了,這裡就不再累述。

四、mainWindow窗口

這個也是給人們提供更好的可視化操作;

一個正常window軟體呈現給客戶的可視化界面;

包括:menu菜單、tool工具欄、status狀態欄、電腦顯示屏右下腳的託盤等。

#include "MyWindow.h"

MyWindow::MyWindow(QMainWindow *parent):QMainWindow( parent ) {

/*menuBar菜單欄,菜單menu*/

QMenuBar *menuBar = this->menuBar() ;

_menu = menuBar->addMenu( "&File" ) ;

QMenu *edit = menuBar->addMenu( "&Edit" ) ;

/*menu菜單中的選項action*/

QAction *openAction = _menu->addAction( "&Open"

, this , SLOT(slotOpen()) , QKeySequence::Open ) ;

QAction *saveAction = _menu->addAction( "&Save"

, this , SLOT(slotOpen()) , QKeySequence::Save ) ;

_menu->addSeparator() ;//添加分界線

QAction *closeAction = _menu->addAction( "&Exit"

, this , SLOT(close()) , QKeySequence::Close ) ;

/*toolBar工具欄*/

QToolBar *toolBar = this->addToolBar( "mimi" ) ;

toolBar->addAction( openAction ) ;

toolBar->addAction( saveAction ) ;

toolBar->addAction( closeAction ) ;

/*statusBar狀態欄*/

QStatusBar *statusBar = this->statusBar() ;

QLabel *label ;

statusBar->addWidget( label = new QLabel("Ok") ) ;

label->setText( "XXXXX... ..." ) ;

/*上面的三種欄介紹完之後,剩下的窗口區域就是CentralWidget

**如果將widget直接add到mainwindow這個窗口的話,

**toolbar是會跟添加進來的widget重疊的*/

MyView *view = new MyView ;

this->setCentralWidget( view ) ;

/*最後就是window系統右下腳的託盤:system tray icon*/

QSystemTrayIcon *icon = new QSystemTrayIcon ;

icon->setIcon( QIcon("./1.png") ) ;//圖標

icon->setToolTip( "luck dog" ) ;//滑鼠滑過提示文字

icon->show() ;//展示在右下角

icon->setContextMenu( _menu ) ;//右擊出現的菜單

this->connect( icon , SIGNAL( slotActivated(QSystemTrayIcon::ActivationReason) )

, this , SLOT(slotActivated(QSystemTrayIcon::QSystemTrayIcon::ActivationReason)) ) ;

this->installEventFilter(this);

}

void MyWindow::slotActivated(QSystemTrayIcon::ActivationReason reason){

/*這個沒成功*/

if( reason==QSystemTrayIcon::Trigger ) {

if( this->isHidden() )

this->show() ;

else

this->hide() ;

}

}

bool MyWindow::eventFilter(QObject *o, QEvent *e)

{

/*實現什麼功能呢?*/

if(o == (QObject*)this && e->type() == QEvent::Close)

{

return true;

}

return QMainWindow::eventFilter(o, e);

}

void MyWindow::slotOpen() {

QString fileName = QFileDialog::getOpenFileName() ;

qDebug()<

/*將打開的文件中的內容顯示在窗口上... ...*/

}

bool MyWindow::event(QEvent *ev)

{

qDebug() << ev;

if(ev->type() == QEvent::Close) {

return false;

}

/*怎麼弄才能實現窗口關閉,託盤還在?*/

return QMainWindow::event(ev);

}

void MyWindow::paintEvent( QPaintEvent * ) {

QPainter painter(this) ;

painter.drawPixmap( QPoint(0,0) , QPixmap("./1.png") ) ;

}

void MyWindow::mousePressEvent( QMouseEvent *ev ) {

if( ev->button() == Qt::RightButton ) {

_menu->exec( QCursor::pos() ) ;

}

}

MyWindow::~MyWindow(void) { }

一、qDebug()函數

qDebug()函數可以直接輸出調試錯誤信息,方便程式設計師調試信息,查找錯誤;

例子:qDebug()<

二、QDebug類

這個函數可以收集錯誤信息,通過QTextStream這個類(之前在寫文件的時候,用過這個類,查看了下函數的作用,果真和自己想的一樣);

QTextStream類,指定一個Qfile*或是QString*作為參數,重載了<

總結:這個錯誤類不是用來輸出信息的(當然簡介使用錯誤函數也是可以輸出信息),更重要的是用來收集錯誤信息,方便統一管理,保存,查看的。

QString *str ;

QDebug q( str = new QString("object") ) ;

q<

qDebug()<< *str ;

相關焦點

  • qt控制項焦點 - CSDN
    們日常切換控制項,例如QQ登陸的帳號和密碼輸入框就可以通過Tab鍵切換焦點。Q_ASSERT(second->d_func()->focus_next->d_func()->focus_prev == second);Q_ASSERT(second->d_func()->focus_prev->d_func()->focus_next == second);}http://blog.csdn.net
  • qt控制項焦點_qt獲取焦點所在控制項 - CSDN
    人們日常切換控制項,例如QQ登陸的帳號和密碼輸入框就可以通過Tab鍵切換焦點。QCheckBox *c = new QCheckBox("複選框"); QComboBox *b = new QComboBox; setTabOrder(p, l); setTabOrder(l, c); setTabOrder(c, b);當然也可以讓控制項屏蔽焦點的使用
  • android 布局控制項重疊專題及常見問題 - CSDN
    方案一利用布局控制項顯示優先級在xml中RelativeLayout,FrameLayout,靠後的控制項顯示在上層。利用margin屬性margin屬性可以控制控制項間的距離,屬性值為正值時,越大離得越遠,越小則離得越近。
  • Qt5+VS2015編程實例:下拉列表框QComboBox控制項使用
    在Qt界面庫中,下拉列表框QComboBox控制項是經常使用到的一個控制項,下面給出一個例子,在VS2015編程環境中,演示下拉列表框的常用編程方法。>1、實例說明軟體運行界面如下圖所示:主界面使用分割條控制項分成了左右兩部分
  • Qt音視頻開發23-通用視頻控制項
    ,該控制項沒有具體的視頻播放控制功能,需要根據不同的內核去調用具體的方法實現,後面還需要增加大華sdk或者其他第三方廠家的協議的時候,直接套用這個通用視頻控制項即可,以後增加新的監控內核,可以省下很多工作量,基本上只需要做內核解析就行,其餘通用接口和繪製圖像直接交給通用視頻控制項就行。
  • Qt音視頻開發1-vlc解碼播放
    一、前言最開始接觸視頻監控這塊的時候,用的就是vlc作為解碼的內核,主要是因為vlc使用簡單方便,直接傳入一個句柄即可,簡單幾行代碼就可以實現一個視頻流播放,很適合初學者使用,也推薦初學者用qt+vlc來做播放器,提供的接口還是非常友好的,而且門類特別多,想要獲取媒體文件的各種信息比如寬高,設置寬高比等,直接調用接口函數傳入參數就能設置
  • Android的五大布局方式 - CSDN
    表格布局(TableLayout):按照行列方式布局組件。 相對布局(RelativeLayout):相對其它組件的布局方式。 絕對布局(AbsoluteLayout):按照絕對坐標來布局組件。1.線性布局(LinearLayout) 線性布局是Android開發中最常見的一種布局方式,它是按照垂直或者水平方向來布局,通過「android:orientation」屬性可以設置線性布局的方向。屬性值有垂直(vertical)和水平(horizontal)兩種。
  • 加載布局 - CSDN
    Android 開發 代碼動態加載布局 動態加載布局分為導入xml控制項和新建控制項兩種,添加至原布局中,適用於動態變化的界面和不適合用xml固定布局的情況 1、自己新建xml
  • qtdesigner信號與槽 - CSDN
    調試信號函數 F11發現是有實現代碼的吧 打開文件所在目錄 查看moc文件夾,分析編譯器都給我們生成了什麼定義了一個結構體qt_meta_stringdata_QtClass_tstruct qt_meta_stringdata_QtClass_t {
  • android 布局 邊距 - CSDN
    減少布局的層次,減少過度繪製。複雜的布局一般會用RelativeLayout嵌套多層RelativeLayout,這樣會導致布局層次過深,性能會很低2. 適配上更靈活ConstrainLayout可以按照比例約束控制尺寸和位置能夠更好的適配不通的機型3.
  • android布局和界面 - CSDN
    Android界面布局1:LinearLayout : 線性布局方式每個元素佔一行或者一列.    LinearLayout是最簡單也是最常用的一種布局方式,它根據orientation 屬性值,將包含的所有控制項或布局對象排列在同一個方向:水平或垂直,在這種布局中,所有的控制項都是依序排列成一條線。在線性布局中的控制項允許有自己的margins和gravity屬性。
  • android水平布局和垂直布局 - CSDN
    權重:android:layout_weight="1"通過設置控制項的layout_weight屬性以控制各個控制項在布局中的相對大小,線性布局會根據該控制項layout_weight值與其所處布局中所有控制項layout_weight值之和的比值為該控制項分配佔用的區域。
  • QT+FFmpeg開發自己的錄屏軟體(1)
    首先我選擇qt作為開發環境,原因呢就是以前用過qt,用起來直接可以上手,然後呢qt開發程序也很方便,不會想windows api mfc之類的很難懂。 選好了開發環境,然後搜索下qt相關錄屏api,不過很可惜,qt只支持攝像頭錄屏和聲音錄屏,而我需要的電腦桌面錄屏則沒有相關接口,雖然網上也有人通過截圖然後把截圖生成視頻的方法,但是個人感覺應該效率不高,所以放棄直接用qt相關接口錄屏。
  • android 布局 覆蓋 - CSDN
    項目中listview中嵌套checkbox,將父控制項設置為android:descendantFocusability="blocksDescendants",這樣設置為的是:會覆蓋子類控制項而直接獲得焦點,即點擊listview的item區域即可選中checkbox。
  • android顯示布局邊界 - CSDN
    減少布局的層次,減少過度繪製。複雜的布局一般會用RelativeLayout嵌套多層RelativeLayout,這樣會導致布局層次過深,性能會很低2. 適配上更靈活ConstrainLayout可以按照比例約束控制尺寸和位置能夠更好的適配不通的機型3.
  • android常用的五大布局 - CSDN
    我們都知道一個豐富的界面是要有很多控制項組成的,那麼我們如何讓各個控制項都有條不紊地擺放在界面上呢?而不是亂糟糟的呢?這就需要藉助於布局來實現了。布局就是對界面結構的全面規劃與安排,從而編寫出精美的界面。 那麼本篇文章,我們自然要將重點放在布局的種類、屬性、添加布局的方式以及如何使用上面了,那我們就開始吧!
  • LXQT:LXDE和Razor-QT桌面環境的合體,首個版本發布
    LXQT是輕量級的桌面環境LXDE的最新版本,LXQT可以看做是LXDE-Qt和Razor-qt兩個項目的合體,該新項目自去年宣布開始,目標是為了打造一個輕量級、模塊化、快速並對用戶友好的桌面環境。LXQT項目組剛剛宣布了LXQT 0.7.0版本——LXQT的首個版本。
  • Qt5+VS2015編程實例:下拉列表框QComboBox控制項使用
    在Qt界面庫中,下拉列表框QComboBox控制項是經常使用到的一個控制項,下面給出一個例子,在VS2015編程環境中,演示下拉列表框的常用編程方法。1、實例說明軟體運行界面如下圖所示:主界面使用分隔條控制項分成了左右兩部分,左邊部分的第一個控制項即為下拉列表框控制項,其餘控制項為對其的常用操作設置,如初始化、清空列表項、插入項、刪除項等操作,右邊部分為一個文本框(QPlainTextEdit)控制項,用以顯示當前列表框包含的所有項及其它操作信息等。下面說下這個例子的詳細編程步驟。
  • android 布局 邊距專題及常見問題 - CSDN
    減少布局的層次,減少過度繪製。複雜的布局一般會用RelativeLayout嵌套多層RelativeLayout,這樣會導致布局層次過深,性能會很低2. 適配上更靈活ConstrainLayout可以按照比例約束控制尺寸和位置能夠更好的適配不通的機型3.
  • Qt Quick Controls 2 Application源碼詳解
    qt qucik項目是什麼呢?上次給大家了一些基本概念,大家都知道了,是使用qml語言進行界面的編寫的,那麼這個Qt Quick Controls 2 Application到底是什麼呢?這次課程咱們來一起學習一下吧。