2016-09-13 112 views
0

我正在学习qt,并试图从书中获取示例,我们必须从主窗口应用程序调用预制对话框。Qt显示从主窗口调用时无框对话框

我已经做了一个对话框,用于输入一个字符串(我们称之为findDialog),输入的字符串被传递给QTableWidget中的自定义槽以搜索输入的字符串。

只要触发一个名为“find”的操作,我就可以调用对话框,但问题是对话框显示为无框。

我打电话给这样的对话框,请指出任何错误。

void MainWindow::find() 
{ 
    // Check whether findDialog is already created 
    if(!finddialog) 
    { 
     // create find dialog as a child to main window 
     finddialog = new findDialog(this); 
     // Connecting signals and slots 
    connect(finddialog,SIGNAL(forwardSearch(QString,Qt::CaseSensitivity)), 
     sheetObject,SLOT(forwardSearch(QString,Qt::CaseSensitivity))); 
     connect(finddialog,SIGNAL(backwardSearch(QString,Qt::CaseSensitivity)), 
     sheetObject,SLOT(backwardSearch(QString,Qt::CaseSensitivity))); 
    } 
    // Show dialog 
    finddialog->show(); 

    finddialog->move(200,200); 
    // Raise if minimised 
    finddialog->raise(); 
    // Activate it 
    finddialog->activateWindow(); 
} 

我不能使用exec因为我没有将findDialog中的accept()槽连接到任何东西。

我也附上一张照片,显示对话时它已被调用。请告诉我我已经完成的错误以及如何使用框架显示对话框。 findDialog without frame

回答

0

您必须创建finddialog与适当的Qt::WindowFlags。请参阅文档:Qt::WindowFlags。例如:

finddialog = new findDialog(this, Qt::Window); 

Indicates that the widget is a window, usually with a window system frame and a title bar, irrespective of whether the widget has a parent or not. Note that it is not possible to unset this flag if the widget does not have a parent.

而且useful example

+0

我编辑的代码,但它是表示作为 '错误:对呼叫“FindDialog的不匹配的函数:: findDialog(MainWindow *,Qt :: WindowType)' finddialog = new findDialog(this,Qt :: Dialog);' –

+0

即使做了这个---> public: 显式的findDialog(QWidget * parent = 0, Qt :: WindowType = Qt :: Window); 〜findDialog();' 它仍然没有显示框架。 –

+0

如果'FindDialog'继承了'QDialog',它将自动产生'Qt :: Window'标志,参见docs [here](https://doc.qt.io/qt-5/qdialog.html#QDialog)和代码[here](https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qdialog.h#n60)。每次你想实例化一个FindDialog时,请不要传递这样的内容。相反,将你想要的行为设为**默认的**行为,并且只是实例化你的FindDialog.you你将不得不通过标志**当你想要标志而不是'Qt :: Window'时。 – Mike

1

明白了,

我必须在显示对话框之前使用setWindowFlags设置窗口标志。

finddialog->setWindowFlags(Qt::Dialog); 

来显示它作为一个对话框

    or 

finddialog->setWindowFlags(Qt::Window); 

到它显示为一个窗口

+0

每次你实例化一个FindDialog时,请不要'setWindowFlags'。如果'FindDialog'已经继承了'QDialog',它将默认具有'Qt :: Window'标志,参见docs [here](https://doc.qt.io/qt-5/qdialog.html#QDialog)和代码[here](https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qdialog.h#n60)。 – Mike

+1

如果您正在使用“使用Qt 4进行C++ GUI编程”一书中的示例,请按照原样进行操作。 'FindDialog'继承'QDialog'(参见第2章创建对话框),你将看到'class FindDialog:public QDialog'。 – Mike

+0

你能解释一下如果我设置窗口标志会发生什么?这只是一个不好的做法或发生了什么?... 我应该从QDialog继承它,但我使用QWidget,只是为了检查它是如何工作的。 –