自定义 Qt 小部件

Posted

技术标签:

【中文标题】自定义 Qt 小部件【英文标题】:Custom Qt Widget 【发布时间】:2012-08-06 00:24:39 【问题描述】:

如何创建一个包含名字、中间名和姓氏字段的简单小部件并将其添加到主窗口类?

我问是因为我不知道为什么下面这个简单的小部件尝试不起作用,我错过了什么?

主要

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

    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();

主窗口类

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    QMainWindow *mainView = new QMainWindow;
    setCentralWidget(mainView);

    CardUI *card = new CardUI;
    QHBoxLayout *hCard = new QHBoxLayout;

    hCard->addWidget(card);

    mainView->setLayout(hCard);
    mainView->show();

cardui类

CardUI::CardUI(QWidget *parent) :  QWidget(parent)
    QLineEdit *fnText = new QLineEdit;
    QLineEdit *miText = new QLineEdit;
    QLineEdit *lnText = new QLineEdit;

    QHBoxLayout *name = new QHBoxLayout;

    name->addWidget(fnText);
    name->addWidget(miText);
    name->addWidget(lnText);

    setLayout(name);

【问题讨论】:

您的 MainWindow 构造函数看起来很奇怪。复制/粘贴问题? 【参考方案1】:
QMainWindow *mainView = new QMainWindow;
//....
mainView->setLayout(hCard);

不应该更改QMainWindow 的布局。使用setCentralWidget 或使用给定的 API 添加工具栏/停靠栏。

在这种特殊情况下,您不应将mainView 创建为QMainWindow(您不能在一个 应用程序中拥有两个 窗口,对吧?)。您可以将mainView 类型更改为QWidget,但您甚至可以不创建任何代理小部件,而只需

MainWindow::MainWindow(QWidget *parent); : QMainWindow(parent)   
    card = new CardUI;
    setCentralWidget(card);

【讨论】:

您可以在应用程序中拥有两个(或更多)QMainWindows,事实上,在 Qt 中,这是在子小部件中“嵌套”工具栏/停靠小部件的唯一方法。但在你的主要观点上,我认为你是对的,这绝对是 OP 在主窗口构造函数中所做的代码气味。 @cbamber85,我正在考虑从语义的角度来看不可能有 2 个主窗口。在这种情况下,代码应该遵循语义)

以上是关于自定义 Qt 小部件的主要内容,如果未能解决你的问题,请参考以下文章

QtDesigner 中的自定义 qt 小部件

使用 Python 为 Qt Designer 自定义 Qt 小部件

具有重叠子小部件的 Qt 自定义小部件

自定义 Qt 设计器小部件:包含自定义垂直布局的滚动区域

自定义小部件的 Qt 样式表

Qt使用UI表单创建自定义小部件[关闭]