国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT子線程或自定義類(lèi)操作訪問(wèn)主界面UI控件的幾種方法

這篇具有很好參考價(jià)值的文章主要介紹了QT子線程或自定義類(lèi)操作訪問(wèn)主界面UI控件的幾種方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

? ?前言? ? ? ??

????????QT創(chuàng)建窗體工程,一般在MainWindow或Dialog類(lèi)里可以直接通過(guò)ui指針訪問(wèn)控件,但是添加新的類(lèi)后又如何訪問(wèn)呢,可以通過(guò)以下幾種方式:

將ui指針公開(kāi)后直接訪問(wèn)

(1)例如有個(gè)自己定義的類(lèi)CustomClass,在自定義類(lèi)里包含主界面指針MainWindow *

class MainWindow;
?
class CustomClass
{
public:
? ? CustomClass(MainWindow * parent);
? ? MainWindow * mainwidow;
? ?void SetUI();
};
(2)主界面類(lèi)將成員Ui::MainWindow *ui 從私有private移動(dòng)到public公共

class MainWindow : public QMainWindow
{
? ? Q_OBJECT
? ??
public:
? ? MainWindow(QWidget *parent = nullptr);
? ? ~MainWindow();
? ? Ui::MainWindow *ui;
? ? CustomClass* customclass;
private: ??
}
(3)自定義類(lèi)包含頭文件:#include "ui_mainwindow.h",構(gòu)造的時(shí)候傳入界面指針MainWindow*,就能通過(guò) mainwidow->ui指針訪問(wèn)UI控件了。

#include "mainwindow.h"
#include "ui_mainwindow.h"
?
CustomClass::CustomClass(MainWindow * parent)
{
? this->mainwidow = parent;
}
?
void CustomClass::SetUI()
{
? ? mainwidow->ui->pushButton->setText("開(kāi)始");
}
記得要引用ui_mainwindow.h,不然會(huì)報(bào)錯(cuò)誤:

error: member access into incomplete type 'Ui::MainWindow'

forward declaration of 'Ui::MainWindow'

封裝成公共函數(shù)

(1)所有對(duì)UI的操作都在主界面MainWindow類(lèi)中,并封裝成公共的函數(shù)

class MainWindow : public QMainWindow
{
? ? Q_OBJECT
? ??
public:
? ? MainWindow(QWidget *parent = nullptr);
? ? ~MainWindow();
? ? ?void SetUI();
? ? CustomClass* customclass;
private: ??
? ? ? ? Ui::MainWindow *ui;
}
?
void MainWindow::SetUI()
{
? ? this->ui->pushButton->setText("開(kāi)始");
}
(2)其他類(lèi)要訪問(wèn)UI調(diào)用函數(shù)就好了

CustomClass::CustomClass(MainWindow * parent)
{
? this->mainwidow = parent;
? this->mainwidow->SetUI();
}

通過(guò)控件指針訪問(wèn)


如果每次只訪問(wèn)一兩個(gè)控件的話,也可以直接將控件指針傳給自定義類(lèi)customclass=new CustomClass(this);
? ? customclass->SetUI(ui->pushButton);
void CustomClass::SetUI(QPushButton* btn)
{
? ? btn->setText("開(kāi)始");
}

通過(guò)信號(hào)和槽訪問(wèn)


前面的方法一般夠用了,但如果是多線程就必須用到信號(hào)和槽機(jī)制,因?yàn)榉荱I線程不能跨線程訪問(wèn)UI,例如定義一個(gè)線程類(lèi)

class MyThread :public QThread
{
? ? Q_OBJECT
public:
? ? MyThread(MainWindow *parent);
? ? MainWindow * mainwidow;
? ? void run() override;
};
在主界面MainWindow類(lèi)里有信號(hào)setui,和槽函數(shù)SetUI,所有對(duì) UI的操作都封裝在槽函數(shù)函數(shù)中

MainWindow::MainWindow(QWidget *parent)
? ? : QMainWindow(parent)
? ? , ui(new Ui::MainWindow)
{
? ? ui->setupUi(this);
? ? //關(guān)聯(lián)信號(hào)
? ? ?connect(this,&MainWindow::setui,this,&MainWindow::SetUI);
? ? ?mythread = new MyThread(this);
? ? ?mythread->start();//啟動(dòng)線程
}
?
void MainWindow::SetUI()
{
? ? this->ui->pushButton->setText("開(kāi)始");
}
在非UI線程里需要訪問(wèn)Ui通過(guò)發(fā)送信號(hào)就行了,槽函數(shù)會(huì)在UI線程中被執(zhí)行

void MyThread::run()
{
? ? //發(fā)送信號(hào),修改UI
? ? emit this->mainwidow->SetUI();
? ? exec();
}
當(dāng)然信號(hào)和槽很靈活,不一定在多線程中,有需要都可以用。

/****************************************

在子線程里控制主界面的UI控件有兩種方法:第一種是在子線程中發(fā)送信號(hào),然后在主線程中去更新;第二種方法是在子線程中創(chuàng)建同樣的對(duì)象,然后把主界面中控件的指針賦給創(chuàng)建的對(duì)象。

第一種方法在此不做實(shí)例展示,在此通過(guò)一個(gè)簡(jiǎn)單的例子展示第二種方法:
下面是主界面的初始轉(zhuǎn)態(tài):

QT子線程或自定義類(lèi)操作訪問(wèn)主界面UI控件的幾種方法,QT,qt,ui,開(kāi)發(fā)語(yǔ)言

下面這個(gè)是繼承自QThread類(lèi)的子線程類(lèi)
sonthread.h

#ifndef SONTHREAD_H
#define SONTHREAD_H

#include <QLabel>
#include <QThread>
#include <QDebug>

class sonThread : public QThread
{
? ? Q_OBJECT
public:
? ? explicit sonThread(QObject *parent = nullptr);
? ? void run();

public:
? ? QLabel *label;
};

#endif // SONTHREAD_H

sonthread.cpp

#include "sonthread.h"

sonThread::sonThread(QObject *parent) : QThread(parent)
{
? ? label = new QLabel;
}

void sonThread::run()
{
? ? qDebug()<<"run()"<<QThread::currentThreadId();
? ??
? ? label->setText("更新");
}

下面是主線程類(lèi)
dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QThread>
#include "sonthread.h"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
? ? Q_OBJECT

public:
? ? explicit Dialog(QWidget *parent = 0);
? ? ~Dialog();


private:
? ? Ui::Dialog *ui;
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"


Dialog::Dialog(QWidget *parent) :
? ? QDialog(parent),
? ? ui(new Ui::Dialog)
{
? ? ui->setupUi(this);

? ? sonThread *sonthread = new sonThread; ?//創(chuàng)建子線程對(duì)象
? ? sonthread->label=ui->label; ?//將主界面UI指針賦給子線程中的指針對(duì)象
? ? sonthread->start(); ?//啟動(dòng)子線程

? ? qDebug()<<"Dialog()"<<QThread::currentThreadId();

}

Dialog::~Dialog()
{
? ? delete ui;
}

下面是運(yùn)行結(jié)果:

QT子線程或自定義類(lèi)操作訪問(wèn)主界面UI控件的幾種方法,QT,qt,ui,開(kāi)發(fā)語(yǔ)言

可以看出run()函數(shù)與主線程不在同一個(gè)線程,而我只在run()中有修改過(guò)label的字符,所以實(shí)現(xiàn)了在子線程中操作主界面UI控件的目的。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-707355.html

到了這里,關(guān)于QT子線程或自定義類(lèi)操作訪問(wèn)主界面UI控件的幾種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • QT在自定義類(lèi)中調(diào)用主類(lèi)(界面類(lèi)ui及其控件)的一種實(shí)用方法

    在實(shí)際應(yīng)用中,經(jīng)常會(huì)出現(xiàn)需要自定義類(lèi)訪問(wèn)界面中的控件的情況,使用信號(hào)和槽進(jìn)行跳轉(zhuǎn)往往過(guò)于繁瑣,使用下述方法可以巧妙解決: 界面類(lèi) QtWidgetsTest.h QtWidgetsTest.cpp 自定義類(lèi) CustomClass.h 首先包含ui頭文件(其實(shí)也可不寫(xiě),因?yàn)閏pp里一定會(huì)包含QtWidgetsTest.h并包含ui文件),

    2024年02月16日
    瀏覽(21)
  • 【Visual Studio】Qt 在其他 cpp 文件中調(diào)用操作 ui 界面控件

    【Visual Studio】Qt 在其他 cpp 文件中調(diào)用操作 ui 界面控件

    知識(shí)不是單獨(dú)的,一定是成體系的。更多我的個(gè)人總結(jié)和相關(guān)經(jīng)驗(yàn)可查閱這個(gè)專(zhuān)欄:Visual Studio。 還整了一個(gè)如何相互之間調(diào)用函數(shù)的文章,感興趣可以看:【Visual Studio】Qt 在其他 cpp 文件中調(diào)用主工程下文件中的函數(shù)。 主界面工程為 A ,添加的文件名字為 test ,目標(biāo)是在

    2024年02月05日
    瀏覽(23)
  • c# 跨線程訪問(wèn)UI控件

    ? ? ? ? 在一個(gè)應(yīng)用程序中,往往存在兩種線程:UI線程和工作線程。 ? ? ? ? UI線程有窗口,創(chuàng)建窗口的控件,且有消息隊(duì)列對(duì)窗口和控件的消息進(jìn)行管理。主要處理和UI相關(guān)的邏輯。 ? ? ? ? 工作線程主要處理和業(yè)務(wù)相關(guān)的比較復(fù)雜的邏輯,當(dāng)處理好之后有可能會(huì)調(diào)用U

    2024年02月08日
    瀏覽(24)
  • QT自定義優(yōu)雅的表單控件,簡(jiǎn)單實(shí)現(xiàn)設(shè)置界面布局

    QT自定義優(yōu)雅的表單控件,簡(jiǎn)單實(shí)現(xiàn)設(shè)置界面布局

    FormView.h FormView.cpp 核心函數(shù) 函數(shù) 變量 功能 addEditableItem title: 輸入框前面的提示文字,同時(shí)作為該控件的標(biāo)識(shí)符 place_holder: 輸入框中的提示文字 在表單中插入一個(gè)可填寫(xiě)項(xiàng) addCheckableItem title: 不顯示在UI中,僅作為該控件的標(biāo)識(shí)符 content: 勾選框后面的內(nèi)容 init_status: 勾選框的初

    2024年02月11日
    瀏覽(29)
  • C#線程操作UI控件

    C#線程操作UI控件

    在寫(xiě)winform程序時(shí)候,如果時(shí)間長(zhǎng)的操作不用線程操作。那么會(huì)卡死UI,點(diǎn)擊界面就體現(xiàn)為未響應(yīng)。為此需要對(duì)耗時(shí)操作用線程處理,比如檢驗(yàn)的監(jiān)聽(tīng)程序就是一個(gè)死循環(huán),不停檢查文件夾或數(shù)據(jù)庫(kù)又沒(méi)有數(shù)據(jù),然后上傳。如果不時(shí)有線程,在數(shù)據(jù)多的情況,程序是基本點(diǎn)不動(dòng)

    2024年02月13日
    瀏覽(20)
  • c#WPF 自定義UI控件學(xué)習(xí),vb.net界面UI美化

    c#WPF 自定義UI控件學(xué)習(xí),vb.net界面UI美化

    最近項(xiàng)目中運(yùn)用到了WPF處理三維軟件,在C/S結(jié)構(gòu)中WPF做UI還是有很多優(yōu)越性,簡(jiǎn)單的學(xué)了一點(diǎn)WPF知識(shí),成功的完成項(xiàng)目目標(biāo)。項(xiàng)目過(guò)度階段對(duì)于WPF的一些基本特點(diǎn)有了進(jìn)一步了解 。至此花費(fèi)一點(diǎn)時(shí)間研究研究WPF控件。 為以后的項(xiàng)目開(kāi)發(fā)中提供一些可觀的資源也是不錯(cuò)的。 目

    2024年02月20日
    瀏覽(21)
  • 【五一創(chuàng)作】VS+Qt主界面內(nèi)嵌自定義控件的四種方法以及不同自定義控件數(shù)據(jù)交互

    【五一創(chuàng)作】VS+Qt主界面內(nèi)嵌自定義控件的四種方法以及不同自定義控件數(shù)據(jù)交互

    在Qt界面開(kāi)發(fā)過(guò)程中,一個(gè)主界面或者主窗口看成是各個(gè)控件排列組合后的集合,對(duì)于一些項(xiàng)目而言,有些常用的控件可以封裝成自己想要的控件樣式并且復(fù)用,比如說(shuō),log顯示控件,圖像/視頻顯示控件等,可以將常用的控件代碼封裝起來(lái),以便下次復(fù)用,內(nèi)嵌在不同的主界

    2024年02月11日
    瀏覽(26)
  • C#中錯(cuò)誤:線程間操作無(wú)效,從不是創(chuàng)建控件的線程訪問(wèn)它。

    一、原因分析 跨線程調(diào)用控件會(huì)出現(xiàn)這個(gè)錯(cuò)誤的原因是因?yàn)椋?NET禁止了跨線程調(diào)用控件, 否則誰(shuí)都可以操作控件,最后可能造成錯(cuò)誤。 所以不是在創(chuàng)建控件所在的線程內(nèi)調(diào)用就會(huì)發(fā)生這樣的錯(cuò)誤。 二、解決辦法 方法1:設(shè)置CheckForIllegalCrossThreadCalls =false 是能去掉這個(gè)檢查的

    2024年02月15日
    瀏覽(24)
  • C#線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它

    C#線程間操作無(wú)效:從不是創(chuàng)建控件“textbox1”的線程訪問(wèn)它

    在C#的多線程訪問(wèn)中,在線程間的相互訪問(wèn)時(shí)因?yàn)榫€程安全問(wèn)題有訪問(wèn)限制,在創(chuàng)建一般線程時(shí),對(duì)于界面元素訪問(wèn)時(shí)這樣的問(wèn)題比較常見(jiàn)。 比如,創(chuàng)建一個(gè)form1,上面放置一個(gè)textbox控件,創(chuàng)建一個(gè)線程去訪問(wèn)textbox,界面如下: 按鈕buuton1的代碼: 就是簡(jiǎn)單地創(chuàng)建一個(gè)線程,

    2023年04月09日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包